package com.tencent.yolov8ncnn;


import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;

import java.io.StringReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

public class GsonUtil {

    /**
     * json:表示通过网络从服务器获取的json格式的数据    clazz:表示json映射的Javabean
     *
     * @param json  json格式的字符串
     * @param clazz json映射的Javabean
     * @param <T>   javabean类型
     * @return
     */
    public static <T> T json2Bean(String json, Class<T> clazz) {
        Gson gson = new GsonBuilder().create();
        JsonReader jsonReader = new JsonReader(new StringReader(json));
        jsonReader.setLenient(true);
        return gson.fromJson(jsonReader, clazz);
    }

    /**
     * 将对象转换为json串
     *
     * @param t
     * @param <T>
     * @return 返回json
     */
    public static <T> String bean2Json(T t) {
        Gson gson = new GsonBuilder().create();
        return gson.toJson(t);
    }

    /**
     * 将json格式的数据转为map
     *
     * @param json json格式的数据
     * @return Map集合
     */
    public static Map<String, String> json2Map(String json) {
        return new GsonBuilder().create().fromJson(json, new TypeToken<Map<String, String>>() {
        }.getType());
    }

    /**
     * 反序列化 map转json
     *
     * @param jsonMap map集合
     * @return 反序列化后的json格式的字符串数据
     */
    public static String map2Json(Map<String, String> jsonMap) {
        Gson gson = new GsonBuilder().create();
        return gson.toJson(jsonMap);
    }

    // 将Json数组解析成相应的映射对象列表
    public static <T> List<T> parseJsonArrayWithGson(String jsonData,Class<T> type) {
        List<T> list = new ArrayList<T>();
        try {
            Gson gson = new Gson();
            JsonArray arry = new JsonParser().parse(jsonData).getAsJsonArray();
            for (JsonElement jsonElement : arry) {
                list.add(gson.fromJson(jsonElement, type));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }

    /**
     * 根据key在json中找出对应的value
     * @param json json数据
     * @param key json键值
     * @return
     */
    public static String getJsonValue(String json,String key){

        JsonReader jsonReader = new JsonReader(new StringReader(json));
        try{
            jsonReader.beginObject();
            while (jsonReader.hasNext()){

                String name = jsonReader.nextName();

                if(key.equals(name)){
                    String value = jsonReader.nextString();
                    return value;
                }

            }
            jsonReader.endObject();
        }catch (Exception ex){
            ex.printStackTrace();
        }


        return "";
    }

    public static String getJsonObjectValue(String json,String key){

        JsonReader jsonReader = new JsonReader(new StringReader(json));
        try{
            jsonReader.beginObject();
            while (jsonReader.hasNext()){

                String name = jsonReader.nextName();

                if(key.equals(name)){
                    return  jsonReader.getPath();
                }

            }
            jsonReader.endObject();
        }catch (Exception ex){
            ex.printStackTrace();
        }
        return "";

    }


    public static <T> List<T> parseJsonArrayToBeanList(JsonArray jsonArray,Class<T> cls){
        Gson gson = new GsonBuilder().create();
        Iterator it = jsonArray.iterator();
        List<T> ts = new ArrayList<>();
        while(it.hasNext()){
            JsonElement e = (JsonElement)it.next();
            //JsonElement转换为JavaBean对象
           T t = gson.fromJson(e, cls);

            ts.add(t);
        }

        return ts;
    }

}
